/*!
 * \file SelStraContext.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief SEL策略上下文头文件
 * 
 * 本文件定义了SEL(Selection)策略上下文类，作为SEL策略与引擎之间的桥梁。
 * 继承自SelStraBaseCtx基础上下文类，提供选股策略的生命周期管理和事件回调功能。
 * 负责将引擎的各种事件（如K线闭合、Tick数据更新、策略调度等）转发给具体的SEL策略实例。
 */
#pragma once
#include "SelStraBaseCtx.h"

USING_NS_WTP;

class SelStrategy;

/**
 * @class SelStraContext
 * @brief SEL策略上下文类
 * 
 * SEL策略上下文类，继承自SelStraBaseCtx，作为SEL策略与SEL引擎之间的桥梁。
 * 专门为选股和组合管理场景设计，支持定时调度和长周期数据处理。
 * 
 * 主要功能包括：
 * - 管理SEL策略实例的生命周期
 * - 处理选股引擎事件并转发给策略
 * - 支持K线数据闭合事件处理
 * - 提供Tick数据更新回调
 * - 支持策略定时调度功能
 * - 处理交易时段开始和结束事件
 * 
 * @note 每个SEL策略实例都对应一个SelStraContext上下文
 * @see SelStraBaseCtx, SelStrategy, WtSelEngine
 */
class SelStraContext : public SelStraBaseCtx
{
public:
	/**
	 * @brief 构造函数
	 * 
	 * 创建SEL策略上下文实例
	 * 
	 * @param engine SEL引擎指针
	 * @param name 策略名称
	 */
	SelStraContext(WtSelEngine* engine, const char* name);
	
	/**
	 * @brief 析构函数
	 * 
	 * 清理资源
	 */
	virtual ~SelStraContext();

	/**
	 * @brief 设置策略实例
	 * 
	 * 将SEL策略实例绑定到当前上下文
	 * 
	 * @param stra SEL策略实例指针
	 */
	void set_strategy(SelStrategy* stra){ _strategy = stra; }
	
	/**
	 * @brief 获取策略实例
	 * 
	 * 获取当前上下文绑定的SEL策略实例
	 * 
	 * @return SEL策略实例指针
	 */
	SelStrategy* get_stragety() { return _strategy; }

public:
	/**
	 * @brief 策略初始化回调
	 * 
	 * 当策略需要初始化时被调用，转发给具体的策略实例
	 */
	virtual void on_init() override;

	/**
	 * @brief 交易时段开始回调
	 * 
	 * 当交易时段开始时被调用，转发给具体的策略实例
	 * 
	 * @param uTDate 交易日期（格式：YYYYMMDD）
	 */
	virtual void on_session_begin(uint32_t uTDate) override;

	/**
	 * @brief 交易时段结束回调
	 * 
	 * 当交易时段结束时被调用，转发给具体的策略实例
	 * 
	 * @param uTDate 交易日期（格式：YYYYMMDD）
	 */
	virtual void on_session_end(uint32_t uTDate) override;

	/**
	 * @brief K线闭合回调
	 * 
	 * 当有K线闭合时被调用，转发给具体的策略实例
	 * 
	 * @param stdCode 标准合约代码
	 * @param period K线周期
	 * @param newBar 新的K线数据
	 */
	virtual void on_bar_close(const char* stdCode, const char* period, WTSBarStruct* newBar) override;

	/**
	 * @brief Tick数据更新回调
	 * 
	 * 当有Tick数据更新时被调用，检查订阅状态后转发给具体的策略实例
	 * 
	 * @param stdCode 标准合约代码
	 * @param newTick 新的Tick数据
	 */
	virtual void on_tick_updated(const char* stdCode, WTSTickData* newTick) override;

	/**
	 * @brief 策略调度回调
	 * 
	 * 当策略需要定时调度时被调用，转发给具体的策略实例
	 * 
	 * @param curDate 当前日期（格式：YYYYMMDD）
	 * @param curTime 当前时间（格式：HHMM）
	 */
	virtual void on_strategy_schedule(uint32_t curDate, uint32_t curTime) override;

private:
	SelStrategy* _strategy;	/**< SEL策略实例指针 */
};

